home *** CD-ROM | disk | FTP | other *** search
/ IRIS Performer 2.2 Friends Demo / SGI IRIS Performer 2.2 Friends Demo.iso / friends / openworlds / tix / MatEdit.tcl < prev    next >
Text File  |  1997-11-22  |  10KB  |  410 lines

  1. tixWidgetClass tixMatEdit {
  2.     -classname TixMatEdit
  3.     -superclass tixPrimitive
  4.     -method {
  5.     get render pick
  6.     }
  7.     -flag {
  8.     -background -bg -foreground -fg
  9.     -command -state -disabledforeground
  10.     -ambient -diffuse -emission -specular
  11.     -alpha -shininess
  12.     }
  13.     -configspec {
  14.     {-background background Background #ffe4c4}
  15.     {-foreground foreground Foreground black}
  16.     {-command command Command {}}
  17.     {-state state State normal}
  18.     {-disabledforeground -disabledForeground DisabledForeground #606060}
  19.  
  20.     {-ambient ambient Ambient {0 0 0}}
  21.     {-diffuse diffuse Diffuse {0 0 0}}
  22.     {-emission emission Emission {0 0 0}}
  23.     {-specular specular Specular {0 0 0}}
  24.     {-alpha alpha Alpha 0}
  25.     {-shininess shininess Shininess 10.0}
  26.     }
  27.     -alias {
  28.     {-bg -background}
  29.     {-fg -foreground}
  30.     }
  31. }
  32.  
  33. proc tixMatEdit::InitWidgetRec {w} {
  34.     upvar #0 $w data
  35.  
  36.     tixChainMethod $w InitWidgetRec
  37.  
  38.     set data(active)    1
  39.     set data(radio)     0
  40.     set data(flag)      0
  41.     set data(dialog)    .edit_color_mat
  42.     set data(amb_v)     1
  43.     set data(dif_v)     1
  44.     set data(spe_v)     1
  45. }
  46.  
  47. #--------------------------
  48. # CREATE WIDGET
  49. #--------------------------
  50. proc tixMatEdit::ConstructWidget {w} {
  51.     upvar #0 $w data
  52.  
  53.     tixChainMethod $w ConstructWidget
  54.  
  55.     #1 create the Material Sphere
  56.     #-------------------
  57.     tixMatSphere $w.matd -relief raised -borderwidth 4
  58.     set data(matd) $w.matd
  59.  
  60.     #2 create the scales
  61.     #-------------------
  62.     frame $w.f4
  63.  
  64.     #2.1 amb
  65.     #-------
  66.     frame $w.f1
  67.     radiobutton $w.b1 -relief flat -variable [format "%s(radio)" $w]\
  68.      -command "tixMatEdit::EditColor $w -ambient"
  69.     set data(w:amb) [scale $w.amb -from 0 -to 100 -length 5c \
  70.     -orient horizontal\
  71.         -label "Ambient" -command "tixMatEdit::ScaleChanged $w -ambient"]
  72.     pack append $w.f1 $w.b1 {left} $data(w:amb) {right expand fill}
  73.  
  74.     #2.2 dif
  75.     #-------
  76.     frame $w.f2
  77.     radiobutton $w.b2 -relief flat -variable [format "%s(radio)" $w]\
  78.     -command "tixMatEdit::EditColor $w -diffuse"
  79.     set data(w:dif) [scale $w.dif -from 0 -to 100 -length 5c \
  80.     -orient horizontal\
  81.     -label "Diffuse" -command "tixMatEdit::ScaleChanged $w -diffuse"]
  82.     pack append $w.f2 $w.b2 {left} $data(w:dif) {right expand fill}
  83.  
  84.     #2.3 spe
  85.     #-------
  86.     frame $w.f3
  87.     radiobutton $w.b3 -relief flat -variable [format "%s(radio)" $w]\
  88.     -command "tixMatEdit::EditColor $w -specular"
  89.     set data(w:spe) [scale $w.spe -from 0 -to 100 -length 5c \
  90.     -orient horizontal\
  91.     -label "Specular" -command "tixMatEdit::ScaleChanged $w -specular"]
  92.     pack append $w.f3 $w.b3 {left} $data(w:spe) {right expand fill}
  93.  
  94.     #3 pack the scales
  95.     #-----------------
  96.     pack append $w.f4 \
  97.     $w.f1 {top expand fill}\
  98.     $w.f2 {top expand fill}\
  99.     $w.f3 {top expand fill}
  100.  
  101.     pack append $w $w.matd {left padx 10 pady 10} $w.f4 {right expand fill}
  102.  
  103.     tixMatEdit::SetScales $w
  104. }
  105.  
  106. proc tixMatEdit::SetBindings {w} {
  107.     upvar #0 $w data
  108.  
  109.     tixChainMethod $w SetBindings
  110.  
  111.     bind $w <Destroy> "tixMatEdit::Destroy $w"
  112. }
  113.  
  114. #----------------------------------------------------------------------
  115. #                           CONFIG OPTIONS
  116. #----------------------------------------------------------------------
  117. proc tixMatEdit::config-state {w arg} {
  118.     upvar #0 $w data
  119.  
  120.     if {$arg == "normal"} {
  121.     $data(w:amb) config -state normal -fg $data(-foreground)
  122.     $data(w:dif) config -state normal -fg $data(-foreground)
  123.     $data(w:spe) config -state normal -fg $data(-foreground)
  124.  
  125.     $w.b1 config -state normal
  126.     $w.b2 config -state normal
  127.     $w.b3 config -state normal
  128.  
  129.     if [winfo exists $data(dialog)] {
  130.         $data(coledit) config -state normal
  131.     }
  132.     } else {
  133.     $data(w:amb) config -state disabled -fg $data(-disabledforeground)
  134.     $data(w:dif) config -state disabled -fg $data(-disabledforeground)
  135.     $data(w:spe) config -state disabled -fg $data(-disabledforeground)
  136.  
  137.     $w.b1 config -state disabled
  138.     $w.b2 config -state disabled
  139.     $w.b3 config -state disabled
  140.  
  141.     if [winfo exists $data(dialog)] {
  142.         $data(coledit) config -state disabled
  143.     }
  144.     }
  145. }
  146.  
  147. proc tixMatEdit::config-ambient {w arg} {
  148.     tixMatEdit::ConfigMat $w -ambient  amb_v $arg
  149. }
  150.  
  151. proc tixMatEdit::config-diffuse {w arg} {
  152.     tixMatEdit::ConfigMat $w -diffuse  dif_v $arg
  153. }
  154.  
  155. proc tixMatEdit::config-specular {w arg} {
  156.     tixMatEdit::ConfigMat $w -specular spe_v $arg
  157. }
  158.  
  159. proc max3 {a b c} {
  160.     if {$a > $b} {
  161.     if {$a > $c} {
  162.         return $a
  163.     } else {
  164.         return $c
  165.     }
  166.     } else {
  167.     if {$b > $c} {
  168.         return $b
  169.     } else {
  170.         return $c
  171.     }
  172.     }
  173. }
  174.  
  175. #----------------------------------------------------------------------
  176. #                           INTERNAL METHODS
  177. #----------------------------------------------------------------------
  178. proc tixMatEdit::ConfigMat {w flag flagv arg} {
  179.     upvar #0 $w data
  180.     
  181.     set r [lindex $arg 0]
  182.     set g [lindex $arg 1]
  183.     set b [lindex $arg 2]
  184.     set m [max3 $r $g $b]
  185.  
  186.     if {$m > "0.0"} {
  187.     set data($flag) [list \
  188.         [expr "$r / $m"] \
  189.         [expr "$g / $m"] \
  190.         [expr "$b / $m"]]
  191.     set data($flagv) $m
  192.     } else {
  193.     set data($flag) {1 1 1}
  194.     set data($flagv) 0
  195.     }
  196.  
  197.     tixMatEdit::SetScales $w
  198.     $data(matd) config $flag $arg
  199.  
  200.     if {[winfo exists $data(dialog)] && $flag == $data(flag)} {
  201.     $data(coledit) config -rgb $data($flag)
  202.     }
  203. }
  204.  
  205. proc tixMatEdit::SetScales {w} {
  206.     upvar #0 $w data
  207.  
  208.     $data(w:amb) set [expr "int($data(amb_v) * 100)"]
  209.     $data(w:dif) set [expr "int($data(dif_v) * 100)"]
  210.     $data(w:spe) set [expr "int($data(spe_v) * 100)"]
  211. }
  212.  
  213. # $$temp : no one calls this proc?
  214. proc tixMatEdit::ResetAll {w} {
  215.     upvar #0 $w data
  216.  
  217.     set data(active) 0
  218.  
  219.     set r [lindex $data(-ambient) 0]
  220.     set g [lindex $data(-ambient) 1]
  221.     set b [lindex $data(-ambient) 2]
  222.     $data(matd) config -ambient \
  223.     [list \
  224.          [expr $r*$data(amb_v)]\
  225.          [expr $g*$data(amb_v)]\
  226.          [expr $b*$data(amb_v)]\
  227.     ]
  228.  
  229.     set r [lindex $data(-diffuse) 0]
  230.     set g [lindex $data(-diffuse) 1]
  231.     set b [lindex $data(-diffuse) 2]
  232.     $data(matd) config -diffuse \
  233.     [list \
  234.          [expr $r*$data(dif_v)]\
  235.          [expr $g*$data(dif_v)]\
  236.          [expr $b*$data(dif_v)]\
  237.     ]
  238.  
  239.     set r [lindex $data(-specular) 0]
  240.     set g [lindex $data(-specular) 1]
  241.     set b [lindex $data(-specular) 2]
  242.     $data(matd) config -specular \
  243.     [list \
  244.          [expr $r*$data(spe_v)]\
  245.          [expr $g*$data(spe_v)]\
  246.          [expr $b*$data(spe_v)]\
  247.     ]
  248.  
  249.     tixMatEdit::SetScales $w
  250.     set data(active) 1
  251. }
  252.  
  253. # This proc does two things
  254. # 1: update the mat diagram to reflect the change.
  255. # 2: acknowledge the owner of the material editor of the change. 
  256. proc tixMatEdit::ScaleChanged {w flag scale_val} {
  257.     upvar #0 $w data
  258.  
  259.     if {$data(active) == "0"} {
  260.     return
  261.     } else {
  262.     case $flag in {
  263.         -ambient {
  264.         set data(amb_v) [expr $scale_val/100.0]
  265.         set r [lindex $data(-ambient) 0]
  266.         set g [lindex $data(-ambient) 1]
  267.         set b [lindex $data(-ambient) 2]
  268.         set ambValues [list \
  269.             [expr $r*$data(amb_v)]\
  270.             [expr $g*$data(amb_v)]\
  271.             [expr $b*$data(amb_v)]]
  272.         $data(matd) config $flag $ambValues
  273.         }
  274.         -diffuse {
  275.         set data(dif_v) [expr $scale_val/100.0]
  276.         set r [lindex $data(-diffuse) 0]
  277.         set g [lindex $data(-diffuse) 1]
  278.         set b [lindex $data(-diffuse) 2]
  279.         set difValues [list \
  280.             [expr $r*$data(dif_v)]\
  281.             [expr $g*$data(dif_v)]\
  282.             [expr $b*$data(dif_v)]]
  283.         $data(matd) config $flag $difValues
  284.         }
  285.         -specular {
  286.         set data(spe_v) [expr $scale_val/100.0]
  287.         set r [lindex $data(-specular) 0]
  288.         set g [lindex $data(-specular) 1]
  289.         set b [lindex $data(-specular) 2]
  290.         set speValues [list \
  291.             [expr $r*$data(spe_v)]\
  292.             [expr $g*$data(spe_v)]\
  293.             [expr $b*$data(spe_v)]]
  294.         $data(matd) config $flag $speValues
  295.         }
  296.     }
  297.  
  298.     if {$data(-command) != {}} {
  299.         set r1 [lindex $data(-ambient) 0]
  300.         set g1 [lindex $data(-ambient) 1]
  301.         set b1 [lindex $data(-ambient) 2]
  302.  
  303.         set r2 [lindex $data(-diffuse) 0]
  304.         set g2 [lindex $data(-diffuse) 1]
  305.         set b2 [lindex $data(-diffuse) 2]
  306.  
  307.         set r3 [lindex $data(-specular) 0]
  308.         set g3 [lindex $data(-specular) 1]
  309.         set b3 [lindex $data(-specular) 2]
  310.  
  311.         set matValues [list \
  312.             [expr $r1 * $data(amb_v)]\
  313.             [expr $g1 * $data(amb_v)]\
  314.             [expr $b1 * $data(amb_v)]\
  315.             [expr $r2 * $data(dif_v)]\
  316.             [expr $g2 * $data(dif_v)]\
  317.             [expr $b2 * $data(dif_v)]\
  318.             [expr $r3 * $data(spe_v)]\
  319.             [expr $g3 * $data(spe_v)]\
  320.             [expr $b3 * $data(spe_v)]]
  321.         eval $data(-command) $flag {$matValues}
  322.     }
  323.     }
  324. }
  325.  
  326. # Pops up a color dialog and change the base color of a, d or sp
  327. #----------------------------------------------------------------------
  328. proc tixMatEdit::EditColor {w flag} {
  329.     upvar #0 $w data
  330.  
  331.     if {$data(active) == "0"} {
  332.     return
  333.     } else {
  334.  
  335.     if {$data(flag) == $flag} {
  336.         tixDialogWithdraw $data(dialog) -xy
  337.         set data(flag) 0
  338.         set data(active) 1
  339.         set data(radio) 0
  340.         return
  341.     }
  342.  
  343.     set data(active) 0
  344.  
  345.      set data(dialog) .color_edit_mat
  346.      if [winfo exists $data(dialog)] {
  347.          tixDialogRestore $data(dialog) -xy
  348.      } else {
  349.          toplevel $data(dialog)
  350.  
  351.          tixColorEdit $data(dialog).edit -relief raised
  352.  
  353.          tixDlgBtns $data(dialog).btns
  354.          $data(dialog).btns add ok -text "OK" \
  355.          -width 6 -command "tixMatEdit::EditColor $w $flag"
  356.  
  357.          pack $data(dialog).edit -fill both -expand yes
  358.          pack $data(dialog).btns -fill x
  359.  
  360.          set data(coledit) $data(dialog).edit
  361.          set data(colbtns) $data(dialog).btns
  362.      }
  363.  
  364.      wm protocol $data(dialog) WM_DELETE_WINDOW \
  365.         "tixMatEdit::EditColor $w $flag"
  366.  
  367.      $data(coledit) config -rgb $data($flag)
  368.      $data(coledit) config -command "tixMatEdit::ColorChanged $w"
  369.      $data(colbtns) subwidget ok \
  370.         config -command "tixMatEdit::EditColor $w $flag"
  371.  
  372.      set data(flag) $flag
  373.      tixDialogRestore $data(dialog) -xy
  374.  
  375.     set data(active) 1
  376.     }
  377. }
  378.  
  379. # Respond to the changes in the color dialog
  380. #-------------------------------------------
  381. proc tixMatEdit::ColorChanged {w r g b} {
  382.     upvar #0 $w data
  383.  
  384.     if {$data(active) == "0"} {
  385.     return
  386.     }
  387.  
  388.     set data($data(flag)) "$r $g $b"
  389.  
  390.     case $data(flag) in {
  391.     -ambient {
  392.         tixMatEdit::ScaleChanged $w $data(flag) [$data(w:amb) get]
  393.     }
  394.     -diffuse {
  395.         tixMatEdit::ScaleChanged $w $data(flag) [$data(w:dif) get]
  396.     }
  397.     -specular {
  398.         tixMatEdit::ScaleChanged $w $data(flag) [$data(w:spe) get]
  399.     }
  400.     }
  401. }
  402.  
  403. proc tixMatEdit::Destroy {w} {
  404.     upvar #0 $w data
  405.  
  406.     if [winfo exists $data(dialog)] {
  407.     tixDialogDestroy $data(dialog) -xy
  408.     }
  409. }
  410.